package com.xzw.day1;

import java.lang.reflect.Method;

public class App {public static void main(String[] args) throws Exception {
    // ===============================================
    // 面向对象的思想
    // ===============================================
    // 创建 User 类的实例
    // >>> 使用 new 关键字调用 User 类的构造器得到实例 u
    User u = new User();
    // >>> 使用实例 u 的 setName 方法为 name 属性赋值为 Timor
    u.setName("马超");
    // >>> 使用实例 u 的 getName 方法获取 name 属性的值
    System.out.println(u.getName());
    // ===============================================
    // 面向对象的思想
    // ===============================================

    // 快捷键：Ctrl + Alt + V 自动生成函数返回值的对象在等号左边

    // ===============================================
    // 反射
    // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    // ===============================================
    // 类的完整限定名 = 类的包名 + 类名
    // 通过类的完整限定名来加载某个类对象
    // 得到的这个 UU 相当于 User 类
    Class<?> UU = Class.forName("com.xzw.day1.User");
    // 通过 UU（类对象） 的 newInstance 方法得到 User 类的实例
    // >>> 相当于面向对象中的  User u = new User();
    Object o = UU.newInstance();

    // 通过 UU（类对象） 的 getMethod 方法查找指定名称的方法
    Method setName = UU.getMethod("setName", String.class);
    // >>> 使用实例 o 来调用 setName 方法并为 o 的 name 属性赋值
    // >>> 相当于面向对象中的  u.setName("马超");
    setName.invoke(o, "马超");

    // 通过 UU（类对象） 的 getMethod 方法查找名称为 getName 的方法
    Method getName = UU.getMethod("getName");
    // >>> 使用实例 o 来调用 getName 方法来获取 o 的 name 属性的值
    Object result = getName.invoke(o);

    System.out.println(result);
}
}

